package com.czy;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 队列的异步消费者
 * <p>
 * 异步消费者【推荐】
 * 第一步：创建一个ConnectionFactory对象。
 * <p>
 * 第二步：从ConnectionFactory对象中获得一个Connection对象。
 * <p>
 * 第三步：开启连接。调用Connection对象的start方法。
 * <p>
 * 第四步：使用Connection对象创建一个Session对象。
 * <p>
 * 第五步：使用Session对象创建一个Destination对象。和发送端保持一致queue，并且队列的名称一致。
 * <p>
 * 第六步：使用Session对象创建一个Consumer对象。
 * <p>
 * 第七步：接收消息。
 * <p>
 * 第八步：打印消息。
 * <p>
 * 第九步：关闭资源
 */
public class ActiveQueueConsumerSync {

    private static String brokerURL = "tcp://127.0.0.1:61616";//在activemq/conf/activemq.xml里面找
    private static String queueName = "queue-hello";

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
        factory.setTrustAllPackages(true);//放行所有包的安全检查
        Connection connection = factory.createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        Queue queue = session.createQueue(queueName);
        MessageConsumer messageConsumer = session.createConsumer(queue);
        System.out.println("3号消费者");

        //一个消费的监听器，当有消息到达时会回调里面的onMessage的方法
        messageConsumer.setMessageListener(new MessageListener() {

            @Override
            public void onMessage(Message message) {
                if (message instanceof TextMessage) {
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("接收到消息,内容为:" + textMessage.getText() + "---" + textMessage.getJMSMessageID());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                } else if (message instanceof MapMessage) {
                    MapMessage mapMessage = (MapMessage) message;
                    try {
                        System.out.println("收到消息:id:" + mapMessage.getInt("id") + "  name:" + mapMessage.getString("name"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                } else if (message instanceof ObjectMessage) {
                    ObjectMessage objectMessage = (ObjectMessage) message;
                    try {
                        System.out.println("收到对象消息:" + objectMessage.getObject() + " 状态:" + objectMessage.getStringProperty("flag"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        System.in.read();//不让程序结束
        session.close();
        messageConsumer.close();
        connection.close();
        System.out.println("消息接收完成.....");
    }

}
